package com.sxl.registry.redis;

import com.sxl.domain.model.entity.ThreadPoolConfigEntity;
import com.sxl.domain.model.valobj.RegistryEnumVO;
import com.sxl.registry.IRegistry;
import org.redisson.api.RBucket;
import org.redisson.api.RList;
import org.redisson.api.RedissonClient;

import java.time.Duration;
import java.util.List;

/**
 * @author : sxl
 * @date : 2024/8/13 9:52
 * @description:
 */
public class RedisRegistry implements IRegistry {

    private final RedissonClient redissonClient;

    //获得redis的客户端
    public RedisRegistry(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    /**
     * 报告线程池配置
     * 此方法用于更新Redisson客户端中的线程池配置列表首先，它会清空现有的线程池配置列表，
     * 然后将新的线程池配置实体列表添加到Redisson客户端的列表中这确保了Redisson客户端
     * 能够反映最新的线程池配置
     * @param threadPoolConfigEntities 线程池配置实体列表，包含了要报告的线程池配置信息
     */
    @Override
    public void reportThreadPool(List<ThreadPoolConfigEntity> threadPoolConfigEntities) {
        // 获取线程池配置列表的Redisson列表实例
        RList<ThreadPoolConfigEntity> list = redissonClient.getList(RegistryEnumVO.THREAD_POOL_CONFIG_LIST_KEY.getKey());
        // 清空线程池配置列表，以移除旧的配置，防止重复
        list.delete();
        // 将新的线程池配置实体列表添加到Redisson列表中
        list.addAll(threadPoolConfigEntities);
    }

    /**
     * 上报线程池配置参数
     * 此方法用于将线程池的配置信息上报到Redisson的缓存中，以便监控和管理
     * @param threadPoolConfigEntity 线程池配置实体，包含线程池的名称、应用名等信息
     */
    @Override
    public void reportThreadPoolConfigParameter(ThreadPoolConfigEntity threadPoolConfigEntity) {
        // 构建缓存键名，用于在Redisson中唯一标识线程池的配置信息
        String cacheKey = RegistryEnumVO.THREAD_POOL_CONFIG_PARAMETER_LIST_KEY.getKey() + "_" + threadPoolConfigEntity.getAppName() + "_" + threadPoolConfigEntity.getThreadPoolName();
        // 使用Redisson客户端获取缓存桶
        RBucket<ThreadPoolConfigEntity> bucket = redissonClient.getBucket(cacheKey);
        // 将线程池配置信息设置到缓存桶中，有效期设置为30天
        bucket.set(threadPoolConfigEntity, Duration.ofDays(30));
    }

}
